package org.example.annotation.swagger;

import org.example.annotation.swagger.Api;
import org.example.annotation.swagger.ApiOperation;
import org.example.annotation.swagger.ApiParam;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;


/**
 * @author: ZhuYouBin
 * @date: 2022/4/9 10:21
 * @description:
 */
public class SwaggerReflection {
    // 通过反射机制,获取自定义注解内容
    public static void main(String[] args) throws NoSuchMethodException {
        // 1、创建Class类对象
        Class<TestAnnotationController> clazz = TestAnnotationController.class;
        // 2、获取类中的方法
        Method method = clazz.getDeclaredMethod("createUser", String.class, String.class, String.class);
        // 获取方法的所有参数对象
        Parameter[] parameters = method.getParameters();
        // 遍历所有参数对象
        for (Parameter parameter : parameters) {
            // 判断当前参数前面是否包含指定注解
            if (parameter.isAnnotationPresent(ApiParam.class)) {
                // 获取指定注解
                ApiParam apiParam = parameter.getAnnotation(ApiParam.class);
                // 获取注解属性
                String value = apiParam.value();
                boolean required = apiParam.required();
                System.out.println("获取value注解属性: " + value);
                System.out.println("获取required注解属性: " + required);
            }
        }
    }

    void test02() throws NoSuchMethodException {
        // 1、创建Class类对象
        Class<TestAnnotationController> clazz = TestAnnotationController.class;
        // 2、获取类中的方法
        Method method = clazz.getDeclaredMethod("createUser", String.class, String.class, String.class);
        // 判断当前 method 方法上面是否存在 @ApiOperation 注解
        if (method.isAnnotationPresent(ApiOperation.class)) {
            // 获取方法上面的指定的注解
            ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
            // 获取注解的属性,直接使用注解访问属性即可
            String value = apiOperation.value();
            String notes = apiOperation.notes();
            System.out.println("访问value属性: " + value);
            System.out.println("访问notes属性: " + notes);
        }
    }

    void test01() {
        // 1、创建Class类对象
        Class<TestAnnotationController> clazz = TestAnnotationController.class;
        // 2、获取类中指定的注解
        // 判断当前 class 类上面是否存在 @Api 注解
        if (clazz.isAnnotationPresent(Api.class)) {
            // 获取类中指定的注解
            Api api = clazz.getAnnotation(Api.class);
            // 获取注解的属性,直接使用注解访问属性即可
            String tags = api.tags();
            System.out.println("访问tags属性: " + tags);
        }
    }
}
